package cn.nkpro.elcube.utils;

import cn.nkpro.elcube.exception.NkSystemException;

import java.io.File;

/**
 * @ Author     ：lbw
 * @ Date       ：17:33 2022/7/25
 * @ Description：
 * @ Modified By：
 */
public class FileUtils {

    /**
     * 删除文件夹
     * 删除文件夹需要把包含的文件及文件夹先删除，才能成功
     *
     * @param directory 文件夹名
     * @return 删除成功返回true,失败返回false
     */
    public static boolean deleteDirectory(String directory) {
        // directory不以文件分隔符（/或\）结尾时，自动添加文件分隔符，不同系统下File.separator方法会自动添加相应的分隔符
        if (!directory.endsWith(File.separator)) {
            directory = directory + File.separator;
        }
        File directoryFile = new File(directory);
        // 判断directory对应的文件是否存在，或者是否是一个文件夹
        if (!directoryFile.exists() || !directoryFile.isDirectory()) {
            System.out.println("文件夹删除失败，文件夹不存在" + directory);
            return false;
        }
        boolean flag = true;
        // 删除文件夹下的所有文件和文件夹
        File[] files = directoryFile.listFiles();
        if(files != null){
            for (File file : files) {  // 循环删除所有的子文件及子文件夹
                // 删除子文件
                if (file.isFile()) {
                    flag = deleteFile(file.getAbsolutePath());
                    if (!flag) {
                        break;
                    }
                } else {  // 删除子文件夹
                    flag = deleteDirectory(file.getAbsolutePath());
                    if (!flag) {
                        break;
                    }
                }
            }
        }else {
            throw new NkSystemException("tmp需要删除的文件为null");
        }

        if (!flag) {
            throw new NkSystemException("删除失败");
        }
        // 最后删除当前文件夹
        if (directoryFile.delete()) {
            System.out.println("删除成功：" + directory);
            return true;
        } else {
            System.out.println("删除失败：" + directory);
            throw new NkSystemException("删除失败：" + directory);
        }
    }

    /**
     * 删除文件
     *
     * @param fileName 文件名
     * @return 删除成功返回true,失败返回false
     */
    private static boolean deleteFile(String fileName) {
        File file = new File(fileName);
        if (file.isFile() && file.exists()) {
            boolean delete = file.delete();
            if(delete){
                System.out.println("删除文件成功：" + fileName);
                return true;
            }else {
                throw new NkSystemException("删除文件失败：" + fileName);
            }
        } else {
            throw new NkSystemException("删除文件失败：" + fileName);
        }
    }
}
